/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejbs;

import entities.Almacen;
import entities.EnvioTraspasoMercancia;
import entities.LineaEnvioTraspasoMercancia;
import entities.LineaPeticionTraspasoMercancia;
import entities.LineaRecepcionTraspasoMercancia;
import entities.LineaTicket;
import entities.PeticionTraspasoMercancia;
import entities.ProductoTalla;
import entities.RecepcionTraspasoMercancia;
import facades.AlmacenFacade;
import facades.LineaInventarioAlmacenFacade;
import facades.LineaPeticionTraspasoMercanciaFacade;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.Stateless;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.enterprise.event.TransactionPhase;
import javax.inject.Inject;
import pos.qualifiers.EventoLineaTicketReservaCreada;
import qualifiers.EventoEntidadCreada;
import qualifiers.EventoPreBorrarEntidad;
import qualifiers.EventoPreEditarEntidad;
import traspasos.qualifiers.EventoPeticionNoSatisfecha;
import traspasos.qualifiers.EventoSolucionarIncidenciaEnviarPerdidas;
import traspasos.qualifiers.EventoSolucionarIncidenciaFalloReceptor;

/**
 *
 * @author damfercer
 */
@Stateless
public class TraspasosEJB {
    @Inject
    private LineaInventarioAlmacenFacade lineaInventarioAlmacenFacade;
    @Inject
    private LineaPeticionTraspasoMercanciaFacade lineaPeticionTraspasoMercanciaFacade;
    @Inject
    private AlmacenFacade almacenFacade;
    @Inject
    Event<Integer> eventoTransferenciaRealizada;
    @Inject
    InventarioEJB inventarioEJB;
    /**
     * Creates a new instance of TraspasosEJB
     */
    public TraspasosEJB() {
    }
        
    public void transferirProductos(Almacen almacenRestarCantidad, Almacen almacenAddCantidad, ProductoTalla productoTalla, Integer cantidad){
        Map<ProductoTalla, Integer> mapa=new HashMap<ProductoTalla, Integer>();
        mapa.put(productoTalla, cantidad);
        List<Almacen> almacenesAdd=new ArrayList<Almacen>();
        List<Almacen> almacenesRestar=new ArrayList<Almacen>();
        almacenesAdd.add(almacenAddCantidad);
        almacenesRestar.add(almacenRestarCantidad);
        inventarioEJB.addCantidadInventario(mapa, almacenesAdd);
        inventarioEJB.restarCantidadInventario(mapa, almacenesRestar);
    }
    
    
    public void onPeticionTraspasoMercancia(@Observes @EventoEntidadCreada PeticionTraspasoMercancia peticion){
        for(LineaPeticionTraspasoMercancia linea: peticion.getLineaPeticionTraspasoMercanciaList()){
            if(linea.getAlmacenEnvio()!=null){
                this.transferirProductos(linea.getAlmacenEnvio().getAlmacenVentasAsociado(), linea.getAlmacenEnvio(), linea.getProductoTalla(), linea.getCantidad());
            }
        }
    }
    
    public void onEnvioTraspasoMercancia(@Observes @EventoEntidadCreada EnvioTraspasoMercancia envioTraspasoMercancia){
        for (LineaEnvioTraspasoMercancia lineaEnvioTraspasoMercancia : envioTraspasoMercancia.getLineaEnvioTraspasoMercanciaList()) {
            transferirProductos(lineaEnvioTraspasoMercancia.getEnvioTraspasoMercancia().getAlmacenEnvio(), almacenFacade.getAlmacenTransportista(), lineaEnvioTraspasoMercancia.getProductoTalla(), lineaEnvioTraspasoMercancia.getCantidad());
            if(lineaEnvioTraspasoMercancia.getLineaPeticionTraspasoMercancia()!=null && lineaEnvioTraspasoMercancia.getCantidad()<lineaEnvioTraspasoMercancia.getLineaPeticionTraspasoMercancia().getCantidad()){
                Integer cantidadNoSatisfecha=lineaEnvioTraspasoMercancia.getLineaPeticionTraspasoMercancia().getCantidad()-lineaEnvioTraspasoMercancia.getCantidad();
                if(lineaEnvioTraspasoMercancia.getLineaPeticionTraspasoMercancia().getAlmacenEnvio().getAlmacenVentasAsociado()!=null){
                    this.transferirProductos(lineaEnvioTraspasoMercancia.getLineaPeticionTraspasoMercancia().getAlmacenEnvio(), lineaEnvioTraspasoMercancia.getLineaPeticionTraspasoMercancia().getAlmacenEnvio().getAlmacenVentasAsociado(), lineaEnvioTraspasoMercancia.getLineaPeticionTraspasoMercancia().getProductoTalla(), cantidadNoSatisfecha);
                }
            }
        }
    }
    
    public void onRecepcionTraspasoMercancia(@Observes @EventoEntidadCreada RecepcionTraspasoMercancia recepcionTraspasoMercancia){
        for(LineaRecepcionTraspasoMercancia lineaRecepcion: recepcionTraspasoMercancia.getLineaRecepcionTraspasoMercanciaList()){
            transferirProductos(almacenFacade.getAlmacenTransportista(), lineaRecepcion.getLineaEnvioTraspasoMercancia().getEnvioTraspasoMercancia().getAlmacenDestino(), lineaRecepcion.getLineaEnvioTraspasoMercancia().getProductoTalla(), lineaRecepcion.getCantidad());
        }
    }
    
    public void onEliminarLineaPeticion(@Observes @EventoPreBorrarEntidad LineaPeticionTraspasoMercancia lineaMemoria){
        LineaPeticionTraspasoMercancia lineaPeticionBBDD=lineaPeticionTraspasoMercanciaFacade.find(lineaMemoria.getIdLineaPeticionTraspasoMercancia());
        if(lineaMemoria.getAlmacenEnvio().getAlmacenVentasAsociado()!=null){
            this.transferirProductos(lineaMemoria.getAlmacenEnvio(), lineaMemoria.getAlmacenEnvio().getAlmacenVentasAsociado(), lineaMemoria.getProductoTalla(), lineaPeticionBBDD.getCantidad());
        }
    }
    
    public void onEditarLineaPeticion(@Observes @EventoPreEditarEntidad LineaPeticionTraspasoMercancia lineaMemoria){
        LineaPeticionTraspasoMercancia lineaPeticionBBDD=lineaPeticionTraspasoMercanciaFacade.find(lineaMemoria.getIdLineaPeticionTraspasoMercancia());
        if(lineaMemoria.getCantidad()>lineaPeticionBBDD.getCantidad()){
            if(almacenFacade.getAlmacenReservaAsociado(lineaMemoria.getAlmacenEnvio())!=null){
                this.transferirProductos(lineaMemoria.getAlmacenEnvio(), almacenFacade.getAlmacenReservaAsociado(lineaMemoria.getAlmacenEnvio()), lineaMemoria.getProductoTalla(), lineaMemoria.getCantidad()-lineaPeticionBBDD.getCantidad());
            }
        }
        else{
           if(almacenFacade.getAlmacenReservaAsociado(lineaMemoria.getAlmacenEnvio())!=null){
                this.transferirProductos(almacenFacade.getAlmacenReservaAsociado(lineaMemoria.getAlmacenEnvio()), lineaMemoria.getAlmacenEnvio(), lineaMemoria.getProductoTalla(), lineaPeticionBBDD.getCantidad()-lineaMemoria.getCantidad());
            } 
        }
    }
    
    
    public void onResolverIncidenciaFalloReceptor(@Observes @EventoSolucionarIncidenciaFalloReceptor RecepcionTraspasoMercancia recepcion){
        for (LineaRecepcionTraspasoMercancia lineaRecepcion : recepcion.getLineaRecepcionTraspasoMercanciaList()) {
            if(lineaRecepcion.getCantidad()!=lineaRecepcion.getLineaEnvioTraspasoMercancia().getCantidad()){
                transferirProductos(almacenFacade.getAlmacenTransportista(), lineaRecepcion.getLineaEnvioTraspasoMercancia().getEnvioTraspasoMercancia().getAlmacenDestino(), lineaRecepcion.getLineaEnvioTraspasoMercancia().getProductoTalla(), lineaRecepcion.getLineaEnvioTraspasoMercancia().getCantidad()-lineaRecepcion.getCantidad());
            }
        }
    }
    
    public void onResolverIncidenciaEnviarPerdidas(@Observes @EventoSolucionarIncidenciaEnviarPerdidas RecepcionTraspasoMercancia recepcion){
        for (LineaRecepcionTraspasoMercancia lineaRecepcion : recepcion.getLineaRecepcionTraspasoMercanciaList()) {
            if(lineaRecepcion.getCantidad()!=lineaRecepcion.getLineaEnvioTraspasoMercancia().getCantidad()){
                transferirProductos(almacenFacade.getAlmacenTransportista(), almacenFacade.getAlmacenPerdidas(), lineaRecepcion.getLineaEnvioTraspasoMercancia().getProductoTalla(), lineaRecepcion.getLineaEnvioTraspasoMercancia().getCantidad()-lineaRecepcion.getCantidad());
            }
        }
    }
    
    public void onNuevaLineaTicketReserva(@Observes @EventoLineaTicketReservaCreada LineaTicket lineaTicket){
        transferirProductos(lineaTicket.getAlmacen().getAlmacenVentasAsociado(), lineaTicket.getAlmacen(), lineaTicket.getProductoTalla(), lineaTicket.getCantidad());
    }
}
